package com.yuanqi.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yuanqi.dto.SalesOrderDTO;
import com.yuanqi.dto.SalesOrderListDTO;
import com.yuanqi.pojo.SalesOrder;
import com.yuanqi.dto.SalesOrderQueryDTO;

import java.util.List;
import java.util.Map;

/**
 * 销售订单服务接口
 */
public interface SalesOrderService extends IService<SalesOrder> {

    /**
     * 创建销售订单
     */
    SalesOrderDTO createSalesOrder(SalesOrderDTO salesOrderDTO);

    /**
     * 更新销售订单
     */
    boolean updateSalesOrder(SalesOrderDTO salesOrderDTO);

    /**
     * 创建或更新销售订单
     */
    SalesOrderDTO createOrUpdateOrder(SalesOrderDTO salesOrderDTO);

    /**
     * 获取销售订单详情
     */
    SalesOrderDTO getSalesOrderDetail(Long orderId);

    /**
     * 根据ID获取订单详情
     */
    SalesOrderDTO getOrderById(Long orderId);

    /**
     * 提交审核
     */
    boolean submitForReview(Long orderId);

    /**
     * 审核通过
     */
    boolean approveOrder(Long orderId, String approvalRemark);

    /**
     * 审核拒绝
     */
    boolean rejectOrder(Long orderId, String rejectReason);

    /**
     * 关闭订单
     */
    boolean closeOrder(Long orderId, String closeReason);

    /**
     * 根据客户ID查询订单
     */
    List<SalesOrder> getOrdersByCustomerId(Long customerId);

    /**
     * 生成订单编码
     */
    String generateOrderCode();

    /**
     * 计算订单金额
     */
    void calculateOrderAmount(SalesOrderDTO salesOrderDTO);

    /**
     * 分页查询销售订单
     */
    IPage<SalesOrderDTO> pageSalesOrders(SalesOrderQueryDTO queryDTO);

    /**
     * 分页查询订单列表（用于前端列表显示）
     */
    IPage<SalesOrderListDTO> getOrderListPage(Integer pageNum, Integer pageSize, String keyword);

    /**
     * 查询所有订单列表（用于前端列表显示）
     */
    List<SalesOrderListDTO> getAllOrderList();

    /**
     * 批量删除订单（先删除订单明细，再删除订单）
     */
    boolean deleteOrderBatch(List<Long> orderIds);

    /**
     * 生成批量打印PDF
     */
    byte[] generateBatchPrintPDF(List<SalesOrder> orders);

    /**
     * 生成单个订单PDF
     */
    byte[] generateSingleOrderPDF(SalesOrder order);

    /**
     * 搜索商品
     */
    List<java.util.Map<String, Object>> searchProducts(String keyword, int pageNo, int pageSize);

    /**
     * 统计商品总数
     */
    Long countProducts(String keyword);

    /**
     * 根据订单ID查询客户名称
     */
    String getCustomerNameByOrderId(Long orderId);

    /**
     * 根据订单ID查询订单信息（包含客户名称）
     */
    Map<String, Object> getOrderInfoById(Long orderId);
}
